package net.cassite.daf4j.ds;

import net.cassite.daf4j.And;
import net.cassite.daf4j.Condition;
import net.cassite.daf4j.ExpressionBoolean;
import net.cassite.daf4j.Or;

import java.util.List;

/**
 * 与或解释器
 *
 * @param <Context>      上下文类型
 * @param <BasicElement> 基本元素
 */
public interface AndOrParser<Context, BasicElement> extends AdvancedParser<Context, BasicElement> {
        /**
         * 取`与`操作
         *
         * @param context       上下文
         * @param conditionList 条件列表
         * @param expList       表达式列表
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement and(Context context, List<Condition> conditionList, List<ExpressionBoolean> expList) throws Exception;

        /**
         * 取`或`操作
         *
         * @param context       上下文
         * @param conditionList 条件列表
         * @param expList       表达式列表
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement or(Context context, List<Condition> conditionList, List<ExpressionBoolean> expList) throws Exception;

        /**
         * 取`与`操作
         *
         * @param context  上下文
         * @param elemList 基本元素列表
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement and(Context context, List<BasicElement> elemList) throws Exception;

        /**
         * 取`或`操作
         *
         * @param context  上下文
         * @param elemList 基本元素列表
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement or(Context context, List<BasicElement> elemList) throws Exception;

        /**
         * 在解释And前调用
         *
         * @param context 上下文
         * @param and     `与`操作内容
         * @return 上下文
         * @throws Exception 可能的异常
         */
        Context beforeParsingAnd(Context context, And and) throws Exception;

        /**
         * 解释And后调用
         *
         * @param context 上下文
         * @param elem    生成的基本元素
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement afterParsingAnd(Context context, BasicElement elem) throws Exception;

        /**
         * 在解释Or前调用
         *
         * @param context 上下文
         * @param or      `或`操作内容
         * @return 上下文
         * @throws Exception 可能的异常
         */
        Context beforeParsingOr(Context context, Or or) throws Exception;

        /**
         * 解释Or后调用
         *
         * @param context 上下文
         * @param elem    生成的基本元素
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement afterParsingOr(Context context, BasicElement elem) throws Exception;
}
